<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

                    <h4>条件判断和循环</h4>
                    <div class="x-wiki-info"><span>4143次阅读</span></div>
                    <hr style="border-top-color:#ccc" />
                    <div class="x-wiki-content x-content"><h3 id="-">条件判断</h3>
<p>计算机之所以能做很多自动化的任务，因为它可以自己做条件判断。</p>
<p>比如，输入用户年龄，根据年龄打印不同的内容，在Python程序中，用<code>if</code>语句实现：</p>
<pre><code>age = 20
if age &gt;= 18:
    print &#39;your age is&#39;, age
    print &#39;adult&#39;
</code></pre><p>根据Python的缩进规则，如果<code>if</code>语句判断是<code>True</code>，就把缩进的两行print语句执行了，否则，什么也不做。</p>
<p>也可以给<code>if</code>添加一个<code>else</code>语句，意思是，如果<code>if</code>判断是<code>False</code>，不要执行<code>if</code>的内容，去把<code>else</code>执行了：</p>
<pre><code>age = 3
if age &gt;= 18:
    print &#39;your age is&#39;, age
    print &#39;adult&#39;
else:
    print &#39;your age is&#39;, age
    print &#39;teenager&#39;
</code></pre><p>注意不要少写了冒号<code>:</code>。</p>
<p>当然上面的判断是很粗略的，完全可以用<code>elif</code>做更细致的判断：</p>
<pre><code>age = 3
if age &gt;= 18:
    print &#39;adult&#39;
elif age &gt;= 6:
    print &#39;teenager&#39;
else:
    print &#39;kid&#39;
</code></pre><p><code>elif</code>是<code>else if</code>的缩写，完全可以有多个<code>elif</code>，所以<code>if</code>语句的完整形式就是：</p>
<pre><code>if &lt;条件判断1&gt;:
    &lt;执行1&gt;
elif &lt;条件判断2&gt;:
    &lt;执行2&gt;
elif &lt;条件判断3&gt;:
    &lt;执行3&gt;
else:
    &lt;执行4&gt;
</code></pre><p><code>if</code>语句执行有个特点，它是从上往下判断，如果在某个判断上是<code>True</code>，把该判断对应的语句执行后，就忽略掉剩下的<code>elif</code>和<code>else</code>，所以，请测试并解释为什么下面的程序打印的是<code>teenager</code>：</p>
<pre><code>age = 20
if age &gt;= 6:
    print &#39;teenager&#39;
elif age &gt;= 18:
    print &#39;adult&#39;
else:
    print &#39;kid&#39;
</code></pre><p><code>if</code>判断条件还可以简写，比如写：</p>
<pre><code>if x:
    print &#39;True&#39;
</code></pre><p>只要<code>x</code>是非零数值、非空字符串、非空list等，就判断为<code>True</code>，否则为<code>False</code>。</p>
<h3 id="-">循环</h3>
<p>Python的循环有两种，一种是for...in循环，依次把list或tuple中的每个元素迭代出来，看例子：</p>
<pre><code>names = [&#39;Michael&#39;, &#39;Bob&#39;, &#39;Tracy&#39;]
for name in names:
    print name
</code></pre><p>执行这段代码，会依次打印<code>names</code>的每一个元素：</p>
<pre><code>Michael
Bob
Tracy
</code></pre><p>所以<code>for x in ...</code>循环就是把每个元素代入变量<code>x</code>，然后执行缩进块的语句。</p>
<p>再比如我们想计算1-10的整数之和，可以用一个<code>sum</code>变量做累加：</p>
<pre><code>sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
    sum = sum + x
print sum
</code></pre><p>如果要计算1-100的整数之和，从1写到100有点困难，幸好Python提供一个range()函数，可以生成一个整数序列，比如range(5)生成的序列是从0开始小于5的整数：</p>
<pre><code>&gt;&gt;&gt; range(5)
[0, 1, 2, 3, 4]
</code></pre><p>range(101)就可以生成0-100的整数序列，计算如下：</p>
<pre><code>sum = 0
for x in range(101):
    sum = sum + x
print sum
</code></pre><p>请自行运行上述代码，看看结果是不是当年高斯同学心算出的5050。</p>
<p>第二种循环是while循环，只要条件满足，就不断循环，条件不满足时退出循环。比如我们要计算100以内所有奇数之和，可以用while循环实现：</p>
<pre><code>sum = 0
n = 99
while n &gt; 0:
    sum = sum + n
    n = n - 2
print sum
</code></pre><p>在循环内部变量<code>n</code>不断自减，直到变为<code>-1</code>时，不再满足while条件，循环退出。</p>
<h3 id="-raw_input">再议raw_input</h3>
<p>最后看一个有问题的条件判断。很多同学会用<code>raw_input()</code>读取用户的输入，这样可以自己输入，程序运行得更有意思：</p>
<pre><code>birth = raw_input(&#39;birth: &#39;)
if birth &lt; 2000:
    print &#39;00前&#39;
else:
    print &#39;00后&#39;
</code></pre><p>输入<code>1982</code>，结果却显示<code>00后</code>，这么简单的判断Python也能搞错？</p>
<p>当然不是Python的问题，在Python的交互式命令行下打印<code>birth</code>看看：</p>
<pre><code>&gt;&gt;&gt; birth
&#39;1982&#39;
&gt;&gt;&gt; &#39;1982&#39; &lt; 2000
False
&gt;&gt;&gt; 1982 &lt; 2000
True
</code></pre><p>原因找到了！原来从<code>raw_input()</code>读取的内容永远以字符串的形式返回，把字符串和整数比较就不会得到期待的结果，必须先用<code>int()</code>把字符串转换为我们想要的整型：</p>
<pre><code>birth = int(raw_input(&#39;birth: &#39;))
</code></pre><p>再次运行，就可以得到正确地结果。但是，如果输入<code>abc</code>呢？又会得到一个错误信息：</p>
<pre><code>Traceback (most recent call last):
  ...
ValueError: invalid literal for int() with base 10: &#39;abc&#39;
</code></pre><p>原来<code>int()</code>发现一个字符串并不是合法的数字时就会报错，程序就退出了。</p>
<p>如何检查并捕获程序运行期的错误呢？后面的<a href="/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832254674584228cd773d4db5a02ab85d2db4f83e000">错误和调试</a>会讲到。</p>
<h3 id="-">小结</h3>
<p>条件判断可以让计算机自己做选择，Python的if...elif...else很灵活。</p>
<p><img src="http://www.liaoxuefeng.com/files/attachments/00138729035993893cc9f9690e042848b0f7e1816815a36000/0" alt="python-if"></p>
<p>循环是让计算机做重复任务的有效的方法，有些时候，如果代码写得有问题，会让程序陷入“死循环”，也就是永远循环下去。这时可以用<code>Ctrl+C</code>退出程序，或者强制结束Python进程。</p>
<p>请试写一个死循环程序。</p>
</div>

                    <hr style="border-top-color:#ccc" />

                    